package com.example.automobile_positioning.util;


import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.util.Log;
import android.util.LruCache;
import android.widget.ImageView;

/**
 * 内存缓存技术工具类
 * 
 * @author 	lizhihiui
 * @since	2016 下午4:36:00
 */

@SuppressLint("NewApi")
public class LruCacheUtils {
	/** 
	 * 内存缓存技术的核心类 
	 */
	private LruCache<String, Bitmap> mMemoryCache;
	
	public LruCache<String, Bitmap> getmMemoryCache() {
		return mMemoryCache;
	}

	public void setmMemoryCache(LruCache<String, Bitmap> mMemoryCache) {
		this.mMemoryCache = mMemoryCache;
	}
	
	public LruCacheUtils() {
		// 获取应用程序最大可用内存
		int maxMemory = (int) Runtime.getRuntime().maxMemory();
		int cacheSize = maxMemory / 8;
		// 设置图片缓存大小为程序最大可用内存的1/8
		mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
			@Override
			protected int sizeOf(String key, Bitmap bitmap) {
				// 重写此方法来衡量每张图片的大小，默认返回图片数量
				return bitmap.getByteCount();
			}
		};
	}
	
	/**
	 * 将一张图片存储到LruCache中。
	 * 
	 * @param key		LruCache的键，
	 * @param bitmap	对应传入键的Bitmap对象
	 */
	public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
		if (getBitmapFromMemoryCache(key) == null) {
                mMemoryCache.put(key, bitmap);
		} else {
			Log.w("CacheUtils", "the resource is aready exits");  // 这个资源早已存在
		}
	}
	
	/**
	 * 从LruCache中获取一张图片，如果不存在就返回null。
	 * 
	 * @param key 	LruCache的键，
	 * @return 		对应传入键的Bitmap对象，或者null。
	 */
	public Bitmap getBitmapFromMemoryCache(String key) {
		if (key != null) {
			return mMemoryCache.get(key);
		}
		return null;
	}
	
	/**
     * 清除缓存
     * 
     * @param key	LruCache的键
     */
	public void clearCache() {
        if (mMemoryCache != null) {
            if (mMemoryCache.size() > 0) {
                Log.d("LruCacheUtils", "mMemoryCache.size() " + mMemoryCache.size());
                mMemoryCache.evictAll();
                Log.d("LruCacheUtils", "mMemoryCache.size()" + mMemoryCache.size());
            }
            mMemoryCache = null;
        }
    }
	
	/**
     * 移除缓存
     * 
     * @param key	LruCache的键
     */
	public synchronized void removeImageCache(String key) {
        if (key != null) {
            if (mMemoryCache != null) {
                Bitmap bitmap = mMemoryCache.remove(key);
                if (bitmap !=null ) {
                	bitmap.recycle();
                }
            }
        }
    }
	
	/**
	 * 加载Bitmap对象。此方法会在LruCache中检查所有屏幕中可见的ImageView的Bitmap对象，
	 * 如果发现任何一个ImageView的Bitmap对象不在缓存中，就会开启异步线程去下载图片。
	 */
	public void loadBitmaps(ImageView imageView, String imageUrl) {
		try {
			Bitmap bitmap = getBitmapFromMemoryCache(imageUrl);
			if (imageView != null && bitmap != null) {
				imageView.setImageBitmap(bitmap);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
